package com.example.eeuse.elasticsearch.service;

import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONException;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.poi.excel.ExcelUtil;
import com.example.eeuse.elasticsearch.mapper.HuaWeiMapper;
import com.example.eeuse.elasticsearch.mapper.PlatformsMapper;
import com.example.eeuse.elasticsearch.mapper.UsNewsMediaChinaEconmonMapper;
import com.example.eeuse.elasticsearch.model.HuaWei;
import com.example.eeuse.elasticsearch.model.Platforms;
import com.example.eeuse.elasticsearch.model.UsNewsMediaChinaEconmonmy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.*;

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.file.FileReader;

import javax.annotation.Resource;
import javax.xml.ws.RespectBinding;


@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class JsonToEsService {

    /**
     * 框架有点奇怪
     */
    private final PlatformsMapper platformsMapper;
    private final UsNewsMediaChinaEconmonMapper usNewsMediaChinaEconmonMapper;
    private final HuaWeiMapper huaWeiMapper;

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    public void importJsonToEs(String jsonFilePath, String indexName) {
        try {
            String jsonContent = FileUtil.readUtf8String(new File(jsonFilePath));
            JSONArray jsonArray = JSONUtil.parseArray(jsonContent);
            log.info("JSONArray size: " + jsonArray.size());
            BulkRequest bulkRequest = new BulkRequest();

            for (int i = 0; i < jsonArray.size(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);

                IndexRequest indexRequest = new IndexRequest(indexName).source(jsonObject);
                bulkRequest.add(indexRequest);
            }

            restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
            System.out.println("JSON data imported to Elasticsearch.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    //这段代码的功能是从一个JSON文件读取数据，并将这些数据插入到数据库中。

    public void readJSON(String jsonFilePath) {
        List<HuaWei> datas = new ArrayList<>();

        try {
            // 读取整个文件为字符串
            String jsonString = new String(Files.readAllBytes(Paths.get(jsonFilePath)), StandardCharsets.UTF_8);
            JSONArray jsonArray = JSONUtil.parseArray(jsonString);

            for (Object item : jsonArray) {
                HuaWei ot = JSONUtil.toBean(item.toString(), HuaWei.class);
                ot.setId(ot.getUuid());
                datas.add(ot);

                // 检查批量插入条件
                if (datas.size() > 10) {
                    log.info("执行一次插入 {}", datas.size());
                    huaWeiMapper.insertBatch(datas);
                    datas.clear();
                }
            }

            // 处理剩余的数据
            if (!datas.isEmpty()) {
                huaWeiMapper.insertBatch(datas);
            }
        } catch (IOException e) {
            e.printStackTrace(); // 或使用日志记录
        } catch (Exception e) {
            e.printStackTrace(); // 或使用日志记录
        }
    }

    public void importDataFromExcel(String filePath) {
        try (FileInputStream fileInputStream = new FileInputStream(filePath);
             Workbook workbook = new XSSFWorkbook(fileInputStream)) {

            Sheet sheet = workbook.getSheetAt(0); // 假设数据在第一个Sheet中
            //创建一个名为rowIterator的变量，它是Iterator<Row>类型的实例。这个变量被初始化为调用sheet对象的iterator()方法的结果。
            Iterator<Row> rowIterator = sheet.iterator();


            //这段代码是Java语言编写的，用于遍历Excel工作表中的行，并忽略标题行。
            //首先，rowIterator是一个迭代器对象，它被初始化为调用sheet的iterator()方法的结果。这里假设sheet是一个实现了Iterable<Row>接口的对象，例如一个Excel工作表。

            //然后，while (rowIterator.hasNext())这行代码开始一个循环，循环条件是rowIterator还有下一个元素。
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                // 忽略标题行
                if (row.getRowNum() == 0) {
                    continue;
                }

                //创建一个新的UsNewsMediaChinaEconmonmy实例，并将其命名为entity。
                UsNewsMediaChinaEconmonmy entity = new UsNewsMediaChinaEconmonmy();
                //从Excel表格的第一个单元格获取网站名称，并将其设置为entity的website_name属性。
                entity.setWebsite_name(row.getCell(0).getStringCellValue());
                //从Excel表格的第二个单元格获取标题，并将其设置为entity的title属性。
                entity.setTitle(row.getCell(1).getStringCellValue());
                //从Excel表格的第三个单元格获取日期字符串，并将其存储在变量dateString中。这里假设日期在第6列，但实际上这里似乎有误，因为根据前两行的模式，这里的2应该表示第3列。
                String dateString = row.getCell(2).getStringCellValue(); // 假设日期在第6列
                //创建一个新的SimpleDateFormat实例，用于将日期字符串解析为日期对象。格式字符串为"yyyy-MM-dd HH:mm:ss"，表示年份、月份、日期、小时、分钟和秒。
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                //使用SimpleDateFormat将日期字符串解析为日期对象，并将结果存储在变量pubtime中。
                Date pubtime = dateFormat.parse(dateString);

                /**
                 * 第三列是 content  第4列 是url吧
                 */
                //从Excel表格的第四个单元格获取作者，并将其设置为entity的author属性。
                entity.setAuthor(row.getCell(3).getStringCellValue());

                //从Excel表格的第五个单元格获取内容，并将其设置为entity的content属性。
                entity.setContent(row.getCell(4).getStringCellValue());

                //从Excel表格的第六个单元格获取文章URL，并将其设置为entity的article_url属性。
                entity.setArticle_url(row.getCell(5).getStringCellValue());

                // 解析日期字符串并设置到实体类中

                entity.setPubtime(pubtime);

                log.info("执行一写入操作开始 {}");

                /**
                 *
                 */
                usNewsMediaChinaEconmonMapper.insert(entity);
                log.info("执行一写入操作结束 {}");

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void importHuaWeiDataFromExcel(String filePath) {
        try (FileInputStream fileInputStream = new FileInputStream(filePath);
             Workbook workbook = new XSSFWorkbook(fileInputStream)) {

            Sheet sheet = workbook.getSheetAt(0); // 假设数据在第一个Sheet中
            //创建一个名为rowIterator的变量，它是Iterator<Row>类型的实例。这个变量被初始化为调用sheet对象的iterator()方法的结果。
            Iterator<Row> rowIterator = sheet.iterator();


            //这段代码是Java语言编写的，用于遍历Excel工作表中的行，并忽略标题行。
            //首先，rowIterator是一个迭代器对象，它被初始化为调用sheet的iterator()方法的结果。这里假设sheet是一个实现了Iterable<Row>接口的对象，例如一个Excel工作表。

            //然后，while (rowIterator.hasNext())这行代码开始一个循环，循环条件是rowIterator还有下一个元素。
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                // 忽略标题行
                if (row.getRowNum() == 0) {
                    continue;
                }

                //创建一个新的UsNewsMediaChinaEconmonmy实例，并将其命名为entity。
                HuaWei entity = new HuaWei();
                //从Excel表格的第一个单元格获取网站名称，并将其设置为entity的website_name属性。
                entity.setWebsite_name(row.getCell(0).getStringCellValue());
                //从Excel表格的第二个单元格获取标题，并将其设置为entity的title属性。
                entity.setTitle(row.getCell(1).getStringCellValue());
                //从Excel表格的第三个单元格获取日期字符串，并将其存储在变量dateString中。这里假设日期在第6列，但实际上这里似乎有误，因为根据前两行的模式，这里的2应该表示第3列。
//                String dateString = row.getCell(2).getStringCellValue(); // 假设日期在第6列
                //创建一个新的SimpleDateFormat实例，用于将日期字符串解析为日期对象。格式字符串为"yyyy-MM-dd HH:mm:ss"，表示年份、月份、日期、小时、分钟和秒。
//                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                //使用SimpleDateFormat将日期字符串解析为日期对象，并将结果存储在变量pubtime中。
//                Date pubtime = dateFormat.parse(dateString);

                /**
                 * 第三列是 content  第4列 是url吧
                 */
                //从Excel表格的第四个单元格获取作者，并将其设置为entity的author属性。


                Cell authorCell = row.getCell(2);

                if (authorCell != null) {
                    entity.setAuthor(authorCell.getStringCellValue());
                } else {
                    // 处理单元格为空的情况，可以设置一个默认值或者采取其他适当的措施
                    entity.setAuthor(""); // 设置默认值为"Unknown"，或者进行其他处理
                }







//                entity.setAuthor(row.getCell(3).getStringCellValue());



                //从Excel表格的第五个单元格获取内容，并将其设置为entity的content属性。
                entity.setContent(row.getCell(3).getStringCellValue());

                //从Excel表格的第六个单元格获取文章URL，并将其设置为entity的article_url属性。
                entity.setUrl(row.getCell(4).getStringCellValue());

                // 解析日期字符串并设置到实体类中

//                entity.setPubtime(pubtime);

                log.info("执行一写入操作开始 {}");

                /**
                 *
                 */
                huaWeiMapper.insert(entity);
                log.info("执行一写入操作结束 {}");

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



}






